
const Tour = require('../model/tourModel');
const catchAsync = require('../utils/catchAsync');
const  factory = require("./handleFactory");
exports.aliasTopTours = (req, res, next) => {
    req.query.limit = '5';
    req.query.sort = '-ratingsAverage,price';
    req.query.fields = 'name,price,ratingsAverage,summary,difficulty';
    next();
}
/**
 * query model query obj
 */


exports.getAllTour = factory.getAll(Tour);
// path 虚拟路径指向  select 保留哪些字段和不要哪些字段
exports.getTour = factory.getOne(Tour,{path:'reviews'});
exports.createTour = catchAsync(async (req, res,next) => {
    console.log(req.body)
    const newTour = await Tour.create(req.body);

    res.status(201).json({
        status: "success",
        data: {
            tour: newTour
        }
    })
    // res.send('Done'); 发送请求后无法设置请求头
})
exports.updateTour = factory.updateOne(Tour);

exports.deleteTour = factory.deleteOne(Tour);

// 管道聚合 把输入的文档轮流处理 类似于pipe的规则
exports.getTourStats = catchAsync(async (req, res,next) => {
    const stats = await Tour.aggregate([{
            $match: {
                ratingsAverage: {
                    $gte: 4.5
                }
            } //查询评分数据高于4.5的
        },
        {
            $group: { // 对数据进行分组 分组之后重新聚合所有数据 比如累加 平均
                _id: '$ratingsAverage',
                //_test:{$toUpper:'$difficulty'},
                numTours: {
                    $sum: 1
                },
                numRatings: {
                    $sum: '$ratingsQuantity'
                }, // 累加分组中的ratingq字段
                avgRating: {
                    $avg: '$ratingsAverage'
                }, // 平均ratingave字段 
                avgPrice: {
                    $avg: '$price'
                },
                minPrice: {
                    $min: '$price'
                },
                maxPrice: {
                    $max: '$price'
                }
            }
        },
        // sort 1 升序 -1 降序
        {
            $sort: {
                avgPrice: 1
            }
        },
        // 再进行分组查询 对过滤后的数据
        // {
        //     $match:{_id:{$ne:'EASY'}}
        // }
    ]);
    res.status(200).json({
        status: 'success',
        data: {
            stats
        }
    })
})

exports.getMonthlyPlan = catchAsync(async (req, res,next) => {
    const year = req.params.year * 1;
    const plan = await Tour.aggregate([
        // 1） 解构startDate字段 原先startDate是一个数组 拥有3个数据 解构之后由一条数据变为了3条数据
        // 每个日期都复制走了原先的其他数据 单独扩展为新的数据 解绑 这边的去重呢
        {
            $unwind: '$startDates'
        },
        // 过滤今年的数据
        {
            $match: {
                startDates: {
                    $gte: new Date(`${year}-01-01`),
                    $lte: new Date(`${year}-12-31`),
                }
            }
        },
        // 分组
        {
            $group: {
                _id: {
                    $month: '$startDates'
                },
                numTourStarts: {
                    $sum: 1
                },
                tours: {
                    $push: '$name'
                },
            }
        },
        // 添加字段
        // {
        //     $addFields:{month:'$_id'}
        // },
        // {
        //     $project:{
        //         _id:0
        //     }
        // },
        // {
        //     $sort:{numTourStarts:-1}
        // },
        // 返回数量的限制 自定义查询？
        // {
        //     $limit:6,
        // }
    ]);
    res.status(200).json({
        status: 'success',
        data: {
            plan
        }
    })

})